home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / cli / mx2src.arc / SCANNER.MOD < prev    next >
Text File  |  1989-01-05  |  8KB  |  293 lines

  1.  
  2. (*              Copyright 1987 fred brooks LogicTek             *)
  3. (*                                                              *)
  4. (*                                                              *)
  5. (*   First Release                      12/8/87-FGB             *)
  6. (*                                                              *)
  7.  
  8. IMPLEMENTATION MODULE  SCANNER;
  9. (*$T-,$S-,$A+ *)
  10. FROM    SYSTEM  IMPORT  ADDRESS,ADR;
  11.  
  12. TYPE 
  13.         charptr         =       POINTER TO CHAR; 
  14.         chset           =       SET OF CHAR;  
  15. (*             internal state record
  16.         scstate =
  17.                 RECORD
  18.                         return          :       LONGINT;
  19.                         auxreturn       :       LONGINT;
  20.                         disp            :       CARDINAL;
  21.                         prevdisp        :       CARDINAL;
  22.                         delim           :       ADDRESS;
  23.                         delimret        :       CARDINAL;
  24.                         bufadr          :       ADDRESS;
  25.                         buflen          :       CARDINAL;
  26.                         mode            :       modes;
  27.                 END;
  28. *)
  29.  
  30. VAR     chrptr                          :       charptr;
  31.         cmdline,textline                :       ARRAY [0..81] OF CHAR;
  32.         ch                              :       CHAR;
  33.  
  34. CONST   alpha   = chset{"A".."Z","a".."z"};
  35.         num     = chset{"+","-","0".."9"};
  36. (* Initialize the scanner and pass a buffer to be scanned. Only one buffer
  37. may be processed by the scanner at a time.                          *)
  38. PROCEDURE       scinit(bufadr: ADDRESS; buflen: CARDINAL);
  39. BEGIN
  40.         state.return:=0;
  41.         state.auxreturn:=0;
  42.         state.disp:=0;
  43.         state.prevdisp:=0;
  44.         state.delim:=NIL;
  45.         state.bufadr:=bufadr;
  46.         state.buflen:=buflen;
  47.         state.mode:=modes{};
  48.         state.delimret:=0;
  49. END             scinit;
  50.  
  51. PROCEDURE       gtdisp(): CARDINAL;
  52. BEGIN
  53. END             gtdisp;
  54.  
  55. PROCEDURE       gbdisp(): CARDINAL;
  56. BEGIN
  57. END             gbdisp;
  58.  
  59. (* set new value as the current scanner displacement *)
  60. PROCEDURE       stdisp(disp: CARDINAL);
  61. BEGIN
  62.         state.prevdisp:=state.disp;
  63.         IF bufeol(disp)=(-2) THEN (* past end of line *)
  64.            state.return:=(-2);
  65.         ELSE
  66.            state.prevdisp:=state.disp;
  67.            state.disp:=disp;
  68.            state.return:=0;
  69.         END;
  70. END             stdisp;
  71.  
  72. PROCEDURE       nxparm;
  73. VAR                i       :       CARDINAL;
  74.                    ch      :       CHAR;
  75. BEGIN
  76.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
  77.         i:=state.disp;
  78.         LOOP
  79.                 IF bufeol(i)<0 THEN
  80.                    state.return:=(-2); (* end of line *)
  81.                    EXIT;
  82.                 END;
  83.                 IF NOT delimit(chrptr^) THEN
  84.                    state.prevdisp:=state.disp;
  85.                    state.disp:=i;
  86.                    state.return:=0;
  87.                    EXIT;
  88.                 END;
  89.                 INC(i);
  90.                 INC(chrptr);
  91.         END;
  92. END             nxparm;
  93.  
  94. (* return 0=not eol, -1=eol, -2=past eol *)
  95. PROCEDURE       bufeol(pos: CARDINAL): INTEGER;
  96. VAR             cptr        :          charptr;
  97.                 eol         :          BOOLEAN;
  98.                 i           :          CARDINAL;
  99. BEGIN
  100.         eol:=FALSE;
  101.         i:=0;
  102.         LOOP
  103.         cptr:=charptr(state.bufadr+ADDRESS(i));
  104.         IF i=state.buflen THEN
  105.            EXIT;
  106.         END;
  107.         IF cptr^='$' THEN (* search for " $" sequence *)
  108.            DEC(cptr);
  109.            IF cptr^=' ' THEN
  110.               DEC(i);
  111.               EXIT; (* i = eol *)
  112.            END;
  113.         END;
  114.         INC(i);
  115.         END; (* loop *)
  116.  
  117.         IF (pos=i-1) THEN
  118.            state.delimret:=2;
  119.            RETURN (-1);
  120.         END;
  121.         IF (pos>i-1) THEN
  122.            state.delimret:=2;
  123.            RETURN (-2);
  124.         END;
  125.         RETURN 0;
  126. END     bufeol;
  127.  
  128. PROCEDURE       delimit(ch: CHAR): BOOLEAN;
  129. BEGIN
  130.         IF (ch=' ') OR (ch=CHAR(0)) THEN
  131.            state.delimret:=0;
  132.            RETURN TRUE;
  133.         END;
  134.         IF ch=',' THEN
  135.            state.delimret:=1;
  136.            RETURN TRUE;
  137.         END;
  138.         RETURN FALSE;
  139. END             delimit;
  140.  
  141. PROCEDURE       bkparm;
  142. BEGIN
  143.         state.disp:=state.prevdisp;
  144. END             bkparm;
  145.  
  146. PROCEDURE       dlim;
  147. BEGIN
  148. END             dlim;
  149.  
  150. PROCEDURE       stmode(mode: modes);
  151. BEGIN
  152. END             stmode;
  153.  
  154. PROCEDURE       char(VAR ch: CHAR);
  155. BEGIN
  156.         state.return:=0;
  157.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
  158.         IF chrptr^#CHAR(0) THEN
  159.            IF state.disp<state.buflen-1 THEN
  160.               INC(state.disp);
  161.            ELSE
  162.               state.return:=(-2);
  163.            END;
  164.         ELSE
  165.            state.return:=(-2);
  166.         END;
  167.         ch:=chrptr^;
  168. END             char;
  169.  
  170. PROCEDURE       bkchar(VAR ch: CHAR);
  171. BEGIN
  172.         state.return:=0;
  173.         IF state.disp=0 THEN
  174.            state.return:=(-2);
  175.            ch:=CHAR(0);
  176.            RETURN;
  177.         END;
  178.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp-1));
  179.         ch:=chrptr^;
  180. END             bkchar;
  181.  
  182. PROCEDURE       nxchar(VAR ch: CHAR);
  183. BEGIN
  184.         state.return:=0;
  185.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
  186.         IF chrptr^#CHAR(0) THEN
  187.            IF state.disp<state.buflen-1 THEN
  188.            ELSE
  189.               state.return:=(-2);
  190.            END;
  191.         ELSE
  192.            state.return:=(-2);
  193.         END;
  194.         ch:=chrptr^;
  195. END             nxchar;
  196.  
  197. PROCEDURE       onenum;
  198. BEGIN
  199. END             onenum;
  200.  
  201. PROCEDURE       ltext(bufadr: ADDRESS; buflen: CARDINAL);
  202. VAR                i,j     :       CARDINAL;
  203.                    textbuf :       charptr;
  204. BEGIN
  205.         textbuf:=bufadr;
  206.         j:=0;
  207.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
  208.         i:=state.disp;
  209.         state.prevdisp:=state.disp;
  210.         IF delimit(chrptr^) THEN
  211.            textbuf^:=CHAR(0);
  212.            state.return:=(-1);
  213.            RETURN;
  214.         END;
  215.  
  216.         LOOP
  217.                 IF bufeol(i)=(-2) THEN (* past eol *)
  218.                    state.return:=(-2);
  219.                    EXIT;
  220.                 END;
  221.                 IF NOT delimit(chrptr^) THEN
  222.                    IF j<buflen THEN (* stop at end of buffer *)
  223.                       textbuf^:=chrptr^;
  224.                    END;
  225.                    state.disp:=i;
  226.                 ELSE
  227.                    INC(j);
  228.                    IF NOT (j>buflen) THEN
  229.                       textbuf^:=CHAR(0);
  230.                    END;
  231.                    IF bufeol(i)=(-1) THEN (* if eol *)
  232.                       state.return:=(-2);
  233.                       EXIT;
  234.                    END;
  235.                    state.disp:=i;
  236.                    state.return:=0;
  237.                    EXIT;
  238.                 END;
  239.                 INC(i);
  240.                 INC(j);
  241.                 INC(chrptr);
  242.                 INC(textbuf);
  243.         END;
  244. END             ltext;
  245.  
  246. PROCEDURE       etext(bufadr: ADDRESS; buflen: CARDINAL);
  247. VAR                i,j     :       CARDINAL;
  248.                    textbuf :       charptr;
  249. BEGIN
  250.         textbuf:=bufadr;
  251.         j:=0;
  252.         chrptr:=charptr(state.bufadr+ADDRESS(state.disp));
  253.         i:=state.disp;
  254.         state.prevdisp:=state.disp;
  255.         IF delimit(chrptr^) THEN
  256.            textbuf^:=CHAR(0);
  257.            state.return:=(-1);
  258.            RETURN;
  259.         END;
  260.  
  261.         LOOP
  262.                 IF bufeol(i)=(-2) THEN (* past eol *)
  263.                    state.return:=(-2);
  264.                    EXIT;
  265.                 END;
  266.                 IF chrptr^# 0C THEN
  267.                    IF j<buflen THEN (* stop at end of buffer *)
  268.                       textbuf^:=chrptr^;
  269.                    END;
  270.                    state.disp:=i;
  271.                 ELSE
  272.                    INC(j);
  273.                    IF NOT (j>buflen) THEN
  274.                       textbuf^:=CHAR(0);
  275.                    END;
  276.                    IF bufeol(i)=(-1) THEN (* if eol *)
  277.                       state.return:=(-2);
  278.                       EXIT;
  279.                    END;
  280.                    state.disp:=i;
  281.                    state.return:=0;
  282.                    EXIT;
  283.                 END;
  284.                 INC(i);
  285.                 INC(j);
  286.                 INC(chrptr);
  287.